import router from '@/router'
import store from '@/store'
import axios from 'axios'
import { Message } from 'element-ui'

// 创建 axios 实例
const service = axios.create({
  // process.env.VUE_APP_BASE_API 的表示读取该变量
  // npm run dev时该变量为 /api,  npm run build:prod时 该变量为 /prod-api
  // 注意: vue 代码中, 处理 NODE_ENV之外, 其他变量都要以 VUE_APP_ 开头
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 60000
})
// 请求拦截器 -- 注入token -- interceptors是拦截器的意思 -- 两个参数是两个回调函数,一个是成功,一个是失败
service.interceptors.request.use(
  // 成功
  (config) => {
    // 注入 token  token在 store.getters.token 拿
    // 只要 有 token 就要检查 token 的时效性
    if (store.getters.token) {
      config.headers.Authorization = `Bearer ${store.getters.token}`
    }
    return config
  },
  (error) => {
    // 失败
    return Promise.reject(error)
  })

// 响应拦截器 -- 主要是用来 解构数据 和 处理异常 的
service.interceptors.response.use(
  // 成功
  (response) => {
    // 先判断是不是 blob
    if (response.data instanceof Blob) return response.data // 返回 Blob文件
    // 解构 data
    const { success, message, data } = response.data // 默认 json 格式
    if (success) {
      // 业务成功
      return data // 返回用户需要的数据
    } else {
      // 业务失败
      Message.error(message) // Message({ type: 'error', message }) 两种写法
      return Promise.reject(new Error(message))
    }
  },
  // 失败
  async(error) => {
    // 401 错误是 token超时
    if (error.response.status === 401) {
      Message.warning('用户信息超时')
      // 调用 store 的 退出登录
      await store.dispatch('user/logoutAction')
      router.push('/login')
      return Promise.reject(error)
    }
    // 提示错误
    Message({ type: 'error', message: error.message })
    return Promise.reject(error)
  })
export default service
